Subdirección de Medicina Complementaria (SUMEC-CENSI)
Published
December 9, 2025
Code
library(tidyverse)library(plotly)library(DT)library(lubridate)# 1. CARGA DE DATOStryCatch({ df_grup <-readRDS("data/df_grupales.rds")}, error =function(e) {stop("Error: No se encuentra df_grupales.rds")})# 2. LIMPIEZA DE DATOSdf_grup_clean <- df_grup %>%mutate(# Convertimos labconf a numérico (Número de Participantes)Participantes =suppressWarnings(as.numeric(as.character(labconf))),Participantes =replace_na(Participantes, 0),# Fecha para series de tiempofecha =make_date(ano, mes, 1) )# --- FUNCIÓN AUXILIAR PARA TABLAS DE DESCARGA ---# Esta función crea estandariza el botón de Excel para todos los gráficosmake_download_table <-function(data_input, filename_label ="datos") {datatable( data_input,extensions ='Buttons',rownames =FALSE,options =list(dom ='Bfrtip',buttons =list(list(extend ='excel', filename = filename_label, title = filename_label),list(extend ='csv', filename = filename_label) ),pageLength =5, # Pocas filas para no ocupar mucho espacioscrollX =TRUE,language =list(url ='//cdn.datatables.net/plug-ins/1.10.11/i18n/Spanish.json') ) )}
1. Análisis Temático (¿Qué actividades se realizan?)
En este gráfico se muestran todos los códigos registrados. Dado que una misma sesión puede abordar múltiples temas, aquí se cuentan todas las actividades individuales.
# Agrupamos por Código para ver cuáles son los temas más frecuentesresumen_temas <- df_grup_clean %>%group_by(codigo) %>%summarise(# Frecuencia: Cuántas veces aparece este código en los registrosFrecuencia_Tematica =n(),# Alcance: Suma de participantes expuestos a este temaPersonas_Expuestas =sum(Participantes, na.rm =TRUE) ) %>%arrange(desc(Personas_Expuestas)) %>%head(15) # Top 15 para que el gráfico sea legible# Gráfico de Barrasplot_ly(resumen_temas, x =~Personas_Expuestas, y =~reorder(codigo, Personas_Expuestas), type ='bar', orientation ='h',text =~paste("<b>Código:</b>", codigo,"<br><b>Veces impartido:</b>", Frecuencia_Tematica,"<br><b>Personas expuestas:</b>", format(Personas_Expuestas, big.mark=",")),hoverinfo ="text",marker =list(color ='#8e44ad')) %>%layout(title ="Top 15 Temáticas Grupales (Por Asistentes)",xaxis =list(title ="Suma de Participantes"),yaxis =list(title ="Código de Actividad"),margin =list(l =100) )
Aquí analizamos las Sesiones Reales. Si en una reunión (id_cita) se trataron 3 temas, aquí cuenta como 1 sola sesión realizada, para no duplicar el esfuerzo logístico en la visualización temporal.
Muestra cuántas personas asistieron en total por mes. Nota: Se toma el máximo de participantes por sesión para evitar duplicados si la misma gente escuchó 3 temas en la misma cita.
Code
# Lógica compleja para no duplicar gente en la misma sesión:# 1. Por cada cita única, tomamos el MÁXIMO de participantes registrado en sus filas# (Asumimos que es el mismo grupo de personas escuchando varios temas)tendencia_participantes <- df_grup_clean %>%group_by(fecha, id_cita) %>%summarise(Asistentes_Sesion =max(Participantes, na.rm=TRUE), .groups ='drop_last') %>%# 2. Sumamos por messummarise(Total_Participantes =sum(Asistentes_Sesion))plot_ly(tendencia_participantes, x =~fecha, y =~Total_Participantes, type ='bar', # Barras para volumen de gentemarker =list(color ='#f39c12'),name ="Participantes") %>%layout(title ="Evolución Mensual: Personas Atendidas en Grupal",xaxis =list(title ="", tickformat ="%b %Y"),yaxis =list(title ="Total Asistentes"),hovermode ="x unified" )